const jwt = require('express-jwt');
const jwtSign = require('jsonwebtoken').sign;
const jwtVerify = require('jsonwebtoken').verify;
const axios = require('axios');
const FormData = require('form-data');
const path = require('path');


const multer = require('multer');
const fs = require('fs');
// 设置存储引擎
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, 'uploads/'); // 保存文件的目录
    },
    filename: function (req, file, cb) {
        cb(null, `${Date.now()}-${file.originalname}`); // 保存文件的名称，避免重名
    }
});
// 初始化multer
const upload = multer({ storage: storage });
// 创建uploads目录（如果不存在）
const uploadDir = './uploads';
if (!fs.existsSync(uploadDir)){
    fs.mkdirSync(uploadDir);
}

// 这是一个模拟的密钥，你应该在生产环境中使用更安全的密钥
const secretKey = 'your_secret_key';

// 自定义JWT验证中间件
function verifyToken(req, res, next) {
    const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1];
    if (!token) {
      return res.status(401).json({ message: 'No token provided.', data: null, code: 401  });
    }
    // console.log('token', token)
   
    jwtVerify(token, secretKey, (err, decoded) => {
      if (err) {
        return res.status(401).json({ message: 'Failed to authenticate token.'});
      }
      // 如果验证成功，将解码后的对象附加到req对象上
      req.user = decoded;
      next(); // 调用next()以继续处理请求
    });
  }
   
module.exports = function (app, response) {

    // 账号密码登录
    app.get('/fyx/login', (req, res) => {
        // 在这里处理登录逻辑，例如验证用户名和密码
        // 假设验证成功，生成一个JWT并返回给客户端
        const token = jwtSign({ username: 'example_user' }, secretKey, { expiresIn: '1h' });
        res.json({ code: 200, data: {
            token
        } });
    });

    const APPID = 'APPID'
    const SECRET = 'SECRET'
    let ACCESS_TOKEN = '' // 需要定时请求刷新接口去做更新这里不做处理，目前是两个小时有效
    let OPENID = ''
    let UNIONID = ''
    let UNIONIDMap = { // 这里简单模拟手机号和unionid进行关联

    } 
    // 微信登录 -- 
    app.post('/fyx/wxlogin', (req, res) => {
        let code = req.body.code || ''
        let tel = req.body.tel || '' // 首次登录必须传递用户手机号
        if(!code) {
            return res.json({
                ...response,
                code: 400,
                msg: '未获取微信code'
            })
        }
        // 通过 code 获取 access_token
        axios({
            method: 'get',
            url: `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${APPID}&secret=${SECRET}&code=${code}&grant_type=authorization_code`, 
            data:  {},
            headers: {}
        })
        .then(function (res1) {
            console.log('axios result', JSON.stringify(res1))
            console.log(res1.code , res1.msg, res1.data);
            ACCESS_TOKEN = res1.data.access_token
            OPENID = res1.data.openid
            UNIONID = res1.data.unionid
        
            // 首次获取用户个人信息（UnionID 机制）
            if(!UNIONIDMap[res.data.unionid]) {
                if(!tel) {
                    return res.json({
                        ...response,
                        code: 400,
                        msg: '首次绑定，必须传递用户手机号'
                    })
                }
                axios({
                    method: 'get',
                    url: `https://api.weixin.qq.com/sns/userinfo?access_token=${ACCESS_TOKEN}&openid=${OPENID}`,
                    data:  {},
                    headers: {}
                })
                .then(function (res) {
                    console.log('axios result2', JSON.stringify(res))
                    console.log(res.code , res.msg, res.data);
                    UNIONIDMap[res.data.unionid] = tel // 模拟数据库，将微信用户unionid和手机号进行关联，并存储微信用户信息（这里不做处理）
                    // 获取的用户信息如下
                    // {
                    //     "openid": "OPENID",
                    //     "nickname": "NICKNAME",
                    //     "sex": 1,
                    //     "province": "PROVINCE",
                    //     "city": "CITY",
                    //     "country": "COUNTRY",
                    //     "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
                    //     "privilege": ["PRIVILEGE1", "PRIVILEGE2"],
                    //     "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
                    //   }
                    res.status({
                        ...response,
                        data: {
                            jwt: 'jwttoken信息'
                        }
                    })
                })
                .catch(function (error) {
                    console.log('err1', error.code, error.message);
                });
            } else {
                // 已经获得过首次获取用户个人信息
                res.status({
                    ...response,
                    data: {
                        jwt: 'jwttoken信息'
                    }
                })
            }
        })
        .catch(function (error) {
            console.log('err1', error.code, error.message);
        });

    })

    // 刷新微信access_token
    app.get('/fyx/refreshwxlogin', (req, res) => {
        // 通过 code 获取 access_token
        axios({
            method: 'get',
            url: `https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=${APPID}&grant_type=refresh_token&refresh_token=${ACCESS_TOKEN}`,
            data:  {},
            headers: {}
        })
        .then(function (response) {
            console.log('axios result2', JSON.stringify(response))
            console.log(response.code , response.msg, response.data);
            ACCESS_TOKEN = response.data.access_token
            res.status({
                ...response
            })
        })
        .catch(function (error) {
            console.log('err1', error.code, error.message);
        });
    })

    // 发送短信验证码
    app.post('/fyx/sendmessage', (req, res) => {
        let tel = req.body.tel
        // console.log('tel', tel)
        if(!tel) {
            return res.json({
                ...response,
                code: 400,
                msg: '请输入手机号'
            })
        }
        if(Date.now() % 2 == 0) {
            // 正确返回结果-
            res.json({
                ...response,
                "logID": "LOGID20250117171244034_s31s@gateway@comms",
                // "code": "0000",
                "msg": "已受理短信发送业务",
                "externalId": "20250117171244921991721449488e874c47f204d0ae0173cd4057644",
                "requestId": "20250117171244042mtghblnn",
                "externalIdMap": {}
            })
        } else {
        // 失败结果1
          res.json({
            "logID": "LOGID20250117170857896_7g7j@gateway@comms",
            "code": "I005",
            "msg": "该20250116180533模板配置需要2个变量参数，但请求参数templateParamSet为null。",
            "requestId": "20250117170857904sqjwkdqg",
            "externalIdMap": {}
          })
        }

        // 成功案例
        let flag = false
        if(falg) {
            let area = '+86'
            axios({
                method: 'post',
                url: 'https://intlsms.market.alicloudapi.com/comms/sms/sendmsgall', 
                data:  {
                    mobile:  area + tel, // 格式为+[国家或地区码][手机号] 必填
                    templateID: '20250116180533',// 模板ID 必填 （需要 提供相关备案官网及营业执照）
                    templateParamSet: '1234,1', // 模板参数(多个参数用逗号分隔)。
                    callbackUrl: 'http://test.dev.esandcloud.com',//短信下发状态回调通知地址（主动回调）
                    channel: 0, // 0: 默认通道（默认值） 1: 高质量通道
                },
                headers: {
                    'Authorization': 'APPCODE 08d79d4b101e42cfb2c271c1871ebd21',
                    // 接口报错400，是因为没有配置这个请求类型
                    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
                }
            })
            .then(function (response) {
                console.log('axios result')
                console.log(response.code , response.msg, response.data);
                // 状态码列表
                // 0000 执行成功，短信发送的状态需要从“获取短信发送状态” 接口获取
                // I005 业务异常
                // 9999 系统异常
                // 1999 服务异常
                // 正确返回结果-
                // {
                //     "logID": "LOGID20250117171244034_s31s@gateway@comms",
                //     "code": "0000",
                //     "msg": "已受理短信发送业务",
                //     "externalId": "20250117171244921991721449488e874c47f204d0ae0173cd4057644",
                //     "requestId": "20250117171244042mtghblnn",
                //     "externalIdMap": {}
                //   }
                // 失败结果1
                // {
                //     "logID": "LOGID20250117170857896_7g7j@gateway@comms",
                //     "code": "I005",
                //     "msg": "该20250116180533模板配置需要2个变量参数，但请求参数templateParamSet为null。",
                //     "requestId": "20250117170857904sqjwkdqg",
                //     "externalIdMap": {}
                //   }
                // 失败结果2. 如果在平台没有申请模板，会出现下面的错误
                // {
                //     "logID": "LOGID20250116175029382_t238@gateway@comms",
                //     "code": "I005",
                //     "msg": "TemplateID异常，没有找到合法的模板。",
                //     "requestId": "20250116175029651bvlficfi",
                //     "externalIdMap": {}
                //   }
            })
            .catch(function (error) {
                // Authorization没有配置对会出现这个错误 ERR_BAD_REQUEST Request failed with status code 400
                // 图片超出大小限制会出现这个错误  err.name PayloadTooLargeError
                console.log('err1', error.code, error.message);
            });
        }

    });

    // 行驶证ocr认证Driving license
    app.post('/fyx/uploadIDdrivinglicense', (req, res) => { //{image: '', configure: {side: 'face/back'}}
        try {
            // 可以上传base64图片也可以上传图片地址，这里只处理base64
            let image = req.body.image 
            if(!req.body.image || !req.body.configure ||  (req.body.configure && (!req.body.configure.side || !['face', 'back'].includes(req.body.configure.side)))) {
                return res.json({
                    ...response,
                    code: 400,
                })
            }
            const byteLength = Math.ceil((image.length * 3) / 4)
            if(byteLength > 102400) {
                return res.json({
                    ...response,
                    code: 400,
                    msg: '图片超出大小，100kb'
                })
            }
            // 这里模拟，随机返回正面或反面照片信息
            if(req.body.configure.side == 'face') {
                res.json({
                    ...response,
                    data: {
                        "config_str": "null\n",         // 配置字符串信息
                        "plate_num": "沪A0M084",        // 车牌号码
                        "vehicle_type":"小型轿车",       // 车辆类型
                        "owner": "张三",                // 所有人名称
                        "use_character":"出租转非",      // 使用性质
                        "addr":"浙江省宁波市江东区丁街88弄", // 地址
                        "model":"桑塔纳牌SVW7180LE1",    // 品牌型号
                        "vin" : "LSVFF66R8C2116280",     // 车辆识别代号
                        "engine_num" : "416098",        // 发动机号码
                        "register_date":"20121127",       // 注册日期
                        "issue_date":"20130708",        // 发证日期
                        "issue_authority": "上海市公安员交通警察总队",             //  签发机关
                        "request_id": "84701974fb983158_20160526100112",             // 请求对应的唯一表示
                        "is_copy": true,        //  是否是复印件（true/false）
                        "success": true                 // 识别成功与否（true/false）
                    }
                })
            } else if(req.body.configure.side == 'back') {
                res.json({
                    ...response,
                    data: {
                        "config_str":"back",  // 配置字符串信息
                        "appproved_passenger_capacity":"5人",    // 核定载人数
                        "approved_load":"",                      // 核定载质量
                        "file_no":"530100001466",                // 档案编号
                        "gross_mass":"2000kg",                   // 总质量
                        "inspection_record":"检验有效期至2014年09月云A(01)",  // 检验记录
                        "overall_dimension":"4945x1845x1480mm",   // 外廓尺寸
                        "traction_mass":"",                       // 准牵引总质量
                        "unladen_mass":"1505kg",                  // 整备质量
                        "plate_num":"云AD8V02",                   // 号牌号码
                        "barcode_number": "1100011415808",       //  条形码编号
                        "energy_type": "汽油",                    //  能源类型
                        "is_copy": true,        //  是否是复印件（true/false）
                        "success":true,              // 识别成功与否（true/false）
                        "request_id":"20180131144149_c440540b20a4dc079a10680ff60b2d2a" // 请求对应的唯一表示
                    }
                })
            }

            
            
            // 阿里云成功调用案例
            let flag = false // 这里不做执行了
            if(flag) {
                console.log('uploadIDbase64', req.body.image)
                let formdata = new FormData()
                formdata.append('image', req.body.image)
                axios({
                    method: 'post',
                    url: 'https://driving.market.alicloudapi.com/rest/160601/ocr/ocr_vehicle.json', 
                    data:  {
                        image: req.body.image,
                        configure: {side: req.body.configure.side}
                    },
                    headers: {
                        'Authorization': 'APPCODE 08d79d4b101e42cfb2c271c1871ebd21'
                    }
                })
                .then(function (response) {
                    console.log('axios result')
                    console.log(response.code , response.msg, response.data);
                    // 正确返回结果--正面
                    // 正确返回结果-反面
                })
                .catch(function (error) {
                    // Authorization没有配置对会出现这个错误 ERR_BAD_REQUEST Request failed with status code 400
                    // 图片超出大小限制会出现这个错误  err.name PayloadTooLargeError
                    console.log('err', error.code, error.message);
                });
            }
            
        } catch (error) {
            console.log('er /fyx/uploa', error)
        }

    })

    // 营业执照ocr认证
    app.post('/fyx/uploadIDbusinesslicense', (req, res) => {
        try {
            // 可以上传base64图片也可以上传图片地址，这里只处理base64
            let image = req.body.image
            if(!req.body.image) {
                return res.json({
                    ...response,
                    code: 400,
                })
            }
            const byteLength = Math.ceil((image.length * 3) / 4)
            if(byteLength > 102400) {
                return res.json({
                    ...response,
                    code: 400,
                    msg: '图片超出大小，100kb'
                })
            }
            // 这里模拟，随机返回正面或反面照片信息
            res.json({
                ...response,
                data: {
                    
                    "config_str" : "null",// //#配置字符串信息
                    "angle" : 0,//float, //#输入图片的角度（顺时针旋转），［0， 90， 180，270］
                    "reg_num": '91440300708461136T', //#统一社会信用代码或注册号，没有识别出来时返回"FailInRecognition"
                    "name" : '深圳市腾讯计算机系统有限公司', //#公司名称，没有识别出来时返回"FailInRecognition"
                    "type" : '有限责任公司', //#公司类型，没有识别出来时返回"FailInRecognition"
                    "person" : '	马化腾', //#公司法人，没有识别出来时返回"FailInRecognition"
                    "establish_date": '1998-11-11', //#公司注册日期(例：证件上为"2014年04月16日"，算法返回"20140416")
                    "valid_period": '1998-11-11 至 无固定期限', //#公司营业期限终止日期(例：证件上为"2014年04月16日至2034年04月15日"，算法返回"20340415")
                    //#当前算法将日期格式统一为输出为"年月日"(如"20391130"),并将"长期"表示为"29991231"，若证件上没有营业期限，则默认其为"长期",返回"29991231"。
                    "address" : '深圳市南山区粤海街道麻岭社区科技中一路腾讯大厦35层', //#公司地址，没有识别出来时返回"FailInRecognition"
                    "capital" : '6500万元', //#注册资本，没有识别出来时返回"FailInRecognition"
                    "business": '一般经营项目是：计算机软、硬件的设计、技术开发、销售（不含专营、专控、专卖商品及限制项目）；数据库及计算机网络服务；国内商业、物资供销业（不含专营、专控、专卖商品）；从事广告业务（法律、行政法规规定应进行广告经营审批等级的，另行办理审批登记后方可经营）；货物及技术进出口；票务代理。，许可经营项目是：第一类增值电信业务中的国内互联网虚拟专用网业务；第二类增值电信业务中的国内多方通信服务业务，国内呼叫中心业务，信息服务业务；网络游戏出版运营；互联网新闻信息转载服务；预包装食品销售（不含冷藏冷冻食品）；利用信息网络经营音乐娱乐产品、游戏产品（含网络游戏虚拟货币发行）、艺术品、演出剧（节）目、动漫产品、表演，从事网络文化产品的展览、比赛活动；互联网视听节目服务；制作、复制、发行电视剧、动画片（制作须另申报），专题、专栏（不含时政新闻类），综艺；出版物零售。', //#经营范围，没有识别出来时返回"FailInRecognition"
                    "companyForm": '有限责任公司', //#组成形式，没有识别出来时返回"FailInRecognition"
                    "emblem" : 'top', //#国徽位置［top,left,height,width］，没有识别出来时返回"FailInDetection"
                    "title" : 'top', //#标题位置［top,left,height,width］，没有识别出来时返回"FailInDetection"
                    "stamp" : 'top', //#印章位置［top,left,height,width］，没有识别出来时返回"FailInDetection"
                    "qrcode" : 'top', //#二维码位置［top,left,height,width］，没有识别出来时返回"FailInDetection",
                    "issue_date": '1998-11-11',  //# 发照日期
                    "is_gray": false,   //#是否是复印件
                    "success" : true, //#识别成功与否 true/false
                    "request_id": ''
                }
            })
            
            
            // 阿里云成功调用案例
            let flag = false // 这里不做执行了
            if(flag) {
                console.log('uploadIDbase64', req.body.image)
                let formdata = new FormData()
                formdata.append('image', req.body.image)
                axios({
                    method: 'post',
                    url: 'https://bizlicense.market.alicloudapi.com/rest/160601/ocr/ocr_business_license.json', 
                    data:  {
                        image: req.body.image
                    },
                    headers: {
                        'Authorization': 'APPCODE 08d79d4b101e42cfb2c271c1871ebd21'
                    }
                })
                .then(function (response) {
                    console.log('axios result')
                    console.log(response.code , response.msg, response.data);
                    // 正确返回结果--正面
                    // 正确返回结果-反面
                })
                .catch(function (error) {
                    // Authorization没有配置对会出现这个错误 ERR_BAD_REQUEST Request failed with status code 400
                    // 图片超出大小限制会出现这个错误  err.name PayloadTooLargeError
                    console.log('err', error.code, error.message);
                });
            }
            
        } catch (error) {
            console.log('er /fyx/uploa', error)
        }

    })


    // 身份证认证ocr-base64或图片地址
    app.post('/fyx/uploadIDbase64', (req, res) => {
        try {
            // 可以上传base64图片也可以上传图片地址，这里只处理base64
            let image = req.body.image
            if(!req.body.image) {
                return res.json({
                    ...response,
                    code: 400,
                })
            }
            const byteLength = Math.ceil((image.length * 3) / 4)
            if(byteLength > 102400) {
                return res.json({
                    ...response,
                    code: 400,
                    msg: '图片超出大小，100kb'
                })
            }
            // 处理图片保存到本地
            const base64Data = image.replace(/^data:image\/\w+;base64,/, "");
            const buffer = Buffer.from(base64Data, 'base64')
            const outputFilePath = path.join(__dirname, 'outputImage.jpeg');
            // 将 Buffer 写入文件
            fs.writeFile(outputFilePath, buffer, (err) => {
                if (err) {
                  console.error('Error writing file:', err);
                } else {
                  console.log('File has been saved!', outputFilePath);
                }
            });
            // 这里模拟，随机返回正面或反面照片信息
            if(Date.now()%2 == 0) {
                res.json({
                    ...response,
                    data: {
                        result: 0,
                        side: 'front',
                        orderNo: '202501234982304',
                        info: {
                          number: '360484200109026529',
                          address: '江西省南昌市南昌县莲塘街道幸福小区202号',
                          month: '09',
                          nation: '汉',
                          year: '2001',
                          sex: '男',
                          name: '李云龙',
                          day: '02'
                        }
                      }
                })
            } else {
                res.json({
                    ...response,
                    data: {
                        result: 0,
                        side: 'back',
                        orderNo: '202501234982307',
                        info: { authority: '平安县公安局', timelimit: '20220207-20320207' }
                    }
                })
            }
            
            
            // 阿里云成功调用案例
            let flag = false // 这里不做执行了
            if(flag) {
                // 客户端的图片没有压缩会出现 {"error":"request entity too large"} 这个500的报错
                console.log('uploadIDbase64', req.body.image)
                let formdata = new FormData()
                formdata.append('image', req.body.image)
                axios({
                    method: 'post',
                    url: 'https://kzcardocr.market.alicloudapi.com/api-mall/api/idcard/ocr', 
                    data:  formdata,
                    headers: {
                        'Authorization': 'APPCODE 08d79d4b101e42cfb2c271c1871ebd21'
                    }
                })
                .then(function (response) {
                    console.log('axios result')
                    // 1. 阿里云返回的不正确的结果 { msg: '无法识别的图片', success: false, code: 400, data: null }
                    // 2. 图片不清楚识别的结果不准 ，像压缩了80kb的照片 居住地址的县和镇名字识别不清
                    console.log(response.code , response.msg, response.data);
                    
                    // 正确返回结果--正面
                    // data: {
                    //     result: 0,
                    //     side: 'front',
                    //     orderNo: '202501xxx',
                    //     info: {
                    //       number: '3604xx',
                    //       address: '江西省xxx',
                    //       month: '1x',
                    //       nation: '汉',
                    //       year: '19xx',
                    //       sex: '男',
                    //       name: '张xx',
                    //       day: '02'
                    //     }
                    //   }
                    // 正确返回结果-反面
                    // msg: '成功',
                    // success: true,
                    // code: 200,
                    // data: {
                    //     result: 0,
                    //     side: 'back',
                    //     orderNo: '20250ssss',
                    //     info: { authority: 'xx县公安局', timelimit: '20220207-20320207' }
                    // }
                })
                .catch(function (error) {
                    // Authorization没有配置对会出现这个错误 ERR_BAD_REQUEST Request failed with status code 400
                    // 图片超出大小限制会出现这个错误  err.name PayloadTooLargeError
                    console.log('err', error.code, error.message);
                });
            }
            
        } catch (error) {
            console.log('er /fyx/uploadID', error)
        }

    })

    // 上传图片到本地
    app.post('/fyx/uploadID',upload.fields([
        { name: 'frontImage', maxCount: 1 },
        { name: 'backImage', maxCount: 1 }
        ]), (req, res) => {
        try {
            res.send({
                code: 200,
                data: null,
                msg: '图片上传成功'
                });
        } catch (error) {
            console.log('er /fyx/uploadID', error)
        }
    })

    // 合同
    // http://localhost:3004/fyx/%E6%96%B0%E8%BD%A6%E9%94%80%E5%94%AE%E5%90%88%E5%90%8C.pdf

    // 错误处理中间件（处理其他可能的错误）
 // 错误处理中间件（处理JWT验证失败的情况）
    app.use((err, req, res, next) => {
        console.log('err.name', err.name)
        if (err.name === 'UnauthorizedError') {
           res.status(401).json({ message: 'Invalid or expired token' });
        } else {
           next(err);
        }
    });
}